// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/src/cmd/gen
// using the template:
//   src/tint/lang/core/intrinsic/ctor_conv.h.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#ifndef SRC_TINT_LANG_CORE_INTRINSIC_CTOR_CONV_H_
#define SRC_TINT_LANG_CORE_INTRINSIC_CTOR_CONV_H_

#include <cstdint>

namespace tint::core::intrinsic {

/// CtorConv is an enumerator of types that have a constructor or converter overload
/// declared in the intrinsic table.
enum class CtorConv : uint8_t {
    kI32,
    kU32,
    kF32,
    kF16,
    kBool,
    kVec2,
    kVec3,
    kVec4,
    kMat2x2,
    kMat2x3,
    kMat2x4,
    kMat3x2,
    kMat3x3,
    kMat3x4,
    kMat4x2,
    kMat4x3,
    kMat4x4,
    kPackedVec3,
    kNone,
};

/// @returns the name of the type.
const char* str(CtorConv i);

/// @param n the width of the vector
/// @return the CtorConv for a vector of width `n`
inline CtorConv VectorCtorConv(uint32_t n) {
    switch (n) {
        case 2:
            return CtorConv::kVec2;
        case 3:
            return CtorConv::kVec3;
        case 4:
            return CtorConv::kVec4;
    }
    return CtorConv::kNone;
}

/// @param c the number of columns in the matrix
/// @param r the number of rows in the matrix
/// @return the CtorConv for a matrix with `c` columns and `r` rows
inline CtorConv MatrixCtorConv(uint32_t c, uint32_t r) {
    switch ((c - 2) * 3 + (r - 2)) {
        case 0:
            return CtorConv::kMat2x2;
        case 1:
            return CtorConv::kMat2x3;
        case 2:
            return CtorConv::kMat2x4;
        case 3:
            return CtorConv::kMat3x2;
        case 4:
            return CtorConv::kMat3x3;
        case 5:
            return CtorConv::kMat3x4;
        case 6:
            return CtorConv::kMat4x2;
        case 7:
            return CtorConv::kMat4x3;
        case 8:
            return CtorConv::kMat4x4;
    }
    return CtorConv::kNone;
}

}  // namespace tint::core::intrinsic

#endif  // SRC_TINT_LANG_CORE_INTRINSIC_CTOR_CONV_H_
